home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / pao / tsr / src / trapver.asm < prev    next >
Assembly Source File  |  1994-06-01  |  16KB  |  497 lines

  1. ;============================================================================
  2. ;    << MASM V5.1 >>  for  FM TOWNS
  3. ;============================================================================
  4. .186
  5.     PAGE        60,132
  6.     NAME        TRAPVER
  7.     TITLE        TRAP VERSION
  8. ;============================================================================
  9. ;    MS-DOSのバージョン番号をトラップする.
  10. ;
  11. ;    All Rights Reserved, Copyright (C) Y.Hirata 1993.
  12. ;    Programmed by Y.Hirata ( NIFTY-ID : NAB03321 )
  13. ;
  14. ;    < NOTE >
  15. ;============================================================================
  16. code        SEGMENT
  17.             ASSUME    cs:code,ds:code,es:code,ss:code
  18. ;----------------------------------------------------------------------------
  19.             ORG        000h
  20. SEGTOP        LABEL    BYTE
  21. ;----------------------------------------------------------------------------
  22.             ORG        02Ch
  23. ENVADRS        LABEL    WORD
  24. ;----------------------------------------------------------------------------
  25.             ORG        080h
  26. ARGUMENT    LABEL    BYTE
  27. ;----------------------------------------------------------------------------
  28.             ORG        100h
  29. entry:        jmp        main
  30. ;----------------------------------------------------------------------------
  31. CR            EQU        0Dh                        ;
  32. LF            EQU        0Ah                        ;
  33. BEL            EQU        07h                        ;
  34. TAB            EQU        09h                        ;
  35. EOF            EQU        1Ah                        ;
  36. ;
  37. COPYRIGHT    DB        CR
  38.             DB        01Bh,'[2K',CR,LF,BEL
  39.             DB        CR,LF,TAB
  40.             DB        'MS-DOS trap-ver  Version 1.00   1993.03.16'
  41.             DB        CR,LF,TAB
  42.             DB        CR,LF,TAB
  43.             DB        'Copyright (C) Y.Hirata 1993.',CR,LF
  44.             DB        CR,LF,EOF
  45. ;
  46. TITLE_name    DB            'TRAP-VER v1.00'    ; 常駐チェック文字列
  47. TITLE_len    EQU            $-TITLE_name        ;
  48. ;
  49. ;****************************************************************************
  50. ;            データ領域
  51. ;****************************************************************************
  52. paraoff        LABEL    BYTE                    ;
  53. v_21        DD        FAR                        ; ベクタアドレス
  54. ver            DB        3                        ; バージョン
  55. lev            DB        10                        ; レベル
  56. parasize    EQU        $-paraoff                ; パラメタ領域サイズ
  57. ;
  58. ;****************************************************************************
  59. ;            MACRO
  60. ;****************************************************************************
  61. TSREND        MACRO                            ; プログラム常駐終了(31H)
  62.             local    close                    ;
  63.             mov        cx,5                    ; デフォルトオープンファイルのクローズ
  64. close:                                        ;
  65.             mov        bx,cx                    ;
  66.             dec        bx                        ; ( 0 ~ 4 )
  67.             mov        ah,3Eh                    ; ファイルクローズ
  68.             int        21h                        ;
  69.             loop    close                    ;
  70. ;
  71.             mov        si,OFFSET ENVADRS        ; 環境変数領域を開放
  72.             mov        ax,cs:[si]                ;
  73.             mov        es,ax                    ;
  74.             mov        ah,49h                    ;
  75.             int        21h                        ;
  76. ;
  77.             mov        dx,OFFSET SEGEND        ;
  78.             add        dx,15                    ;
  79.             shr        dx,4                    ; パラグラフ単位
  80.             mov        ax,3100h                ;
  81.             int        21h                        ; 常駐終了
  82.             ENDM                            ;
  83. ;----------------------------------------------------------------------------
  84. PRGEND        MACRO                            ; プログラム終了(4CH)
  85.             mov        ax,4C00h                ;
  86.             int        21h                        ; Program End !
  87.             ENDM                            ;
  88. ;----------------------------------------------------------------------------
  89. INT21H        MACRO                            ; DOS call
  90.             pushf                            ;
  91.             call    cs:[v_21]                ;
  92.             ENDM                            ;
  93. ;
  94. ;****************************************************************************
  95. ;            常駐処理部
  96. ;****************************************************************************
  97. ;----------------------------------------------------------------------------
  98. ;    割り込みフック処理                            ;
  99. ;----------------------------------------------------------------------------
  100. i21h        PROC    FAR                        ;
  101.             cmp        ah,30h                    ;
  102.             jnz        short i21h_org            ;
  103.             INT21H                            ; DOS call
  104.             mov        al,cs:ver                ;
  105.             mov        ah,cs:lev                ;
  106.             sti                                ; 割り込み許可
  107.             ret        2                        ; フラグをpopせずに,iretをシミュレート
  108. i21h_org:                                    ;
  109.             jmp        cs:[v_21]                ; 本来のベクタに処理を移す。
  110. i21h        ENDP                            ;
  111. ;----------------------------------------------------------------------------
  112. SEGEND        LABEL    BYTE                    ; ↑ここまでを常駐
  113. ;----------------------------------------------------------------------------
  114. ;
  115. ;****************************************************************************
  116. ;            非常駐処理部
  117. ;****************************************************************************
  118. ;----------------------------------------------------------------------------
  119. ;    文字列表示(^C無効)
  120. ;    < IN  >    : ds:si    文字列格納位置    
  121. ;
  122. ;    < USE >    : si
  123. ;----------------------------------------------------------------------------
  124. puts        PROC    NEAR                    ;
  125.             push    dx                        ;
  126. putslp:                                        ;
  127.             mov        dl,[si]                    ;
  128.             or        dl,dl                    ; 文字列終端 ?
  129.             jz        short putsend            ; YES->終了
  130.             mov        ah,02                    ;
  131.             int        21h                        ; 文字表示
  132.             inc        si                        ;
  133.             jmp        short putslp            ;
  134. putsend:                                    ;
  135.             pop        dx                        ;
  136.             ret                                ;
  137. puts        ENDP                            ;
  138. ;----------------------------------------------------------------------------
  139. ;    ベクタ取得(ds=csでcall)
  140. ;    < RET >    : es:bx    ベクタアドレス
  141. ;----------------------------------------------------------------------------
  142. getvct:                                        ;
  143.             mov        ax,3521h                ;
  144.             int        21h                        ; 割込みベクタ取得
  145.             mov        WORD PTR v_21,bx        ;
  146.             mov        WORD PTR v_21+2,es        ; 本来の割り込みベクタの取得・保存
  147.             ret                                ;
  148. ;----------------------------------------------------------------------------
  149. ;    常駐文字列チェック(ds=csでcall)
  150. ;    < IN  >    : es    常駐セグメント
  151. ;    < RET >    : ゼロフラグ (等しければ, ゼロフラグon)
  152. ;
  153. ;    < USE >    : si, di
  154. ;----------------------------------------------------------------------------
  155. tsrcmp:                                        ;
  156.             mov        cx,TITLE_len            ;
  157.             mov        si,OFFSET TITLE_name    ; ds:si
  158.             mov        di,OFFSET TITLE_name    ; es:di
  159.     repz    cmpsb                            ; 常駐チェック
  160.             ret                                ;
  161. ;----------------------------------------------------------------------------
  162. ;    常駐チェック(ds=csでcall)
  163. ;    < RET >    : es:bx    常駐アドレス
  164. ;
  165. ;    < USE >    : ax, si, di
  166. ;----------------------------------------------------------------------------
  167. tsr_chk:                                    ;
  168.             mov        BYTE PTR tsrflg,0        ; 常駐フラグクリア
  169.             mov        BYTE PTR hookflg,0        ; ベクタフックフラグクリア
  170. mcb_chk:                                    ;
  171.             mov        ah,52h                    ; 内部変数領域アドレス取得
  172.             int        21h                        ;
  173.             mov        es,es:[bx-2]            ; 先頭MCBセグメントアドレス
  174. mcb_lp:                                        ;
  175.             cmp        BYTE PTR es:[0],'Z'        ; 最終MCB ?
  176.             je        short mcb_end            ; YES->終了
  177.             cmp        BYTE PTR es:[0],'M'        ; MCB ?
  178.             jne        short mcb_err            ; NO ->MCB MARK ERROR
  179. mcb_idchk:                                    ;
  180.             push    es                        ; MCBセグメント退避
  181.             mov        es,WORD PTR es:[1]        ; PSPセグメント(Owner ID)
  182.             mov        ax,es                    ;
  183.             cmp        ax,pspseg                ; 起動プログラムのPSPか ?
  184.             je        short mcb_next            ; YES->次のMCBをチェック
  185.             call    tsrcmp                    ; 常駐文字列照合
  186.             jz        short mcb_on            ; 等しければ, 常駐済
  187. mcb_next:                                    ;
  188.             pop        es                        ; MCBセグメント復元
  189.             mov        ax,es                    ;
  190.             add        ax,es:[3]                ; 使用メモリのパラグラフ数加算
  191.             inc        ax                        ; 次のMCBセグメント
  192.             mov        es,ax                    ;
  193.             jmp        short mcb_lp            ;
  194. mcb_on:                                        ; 常駐済
  195.             pop        ax                        ; スタック調整
  196.             mov        BYTE PTR tsrflg,1        ;
  197. mcb_end:                                    ; 非常駐
  198.             push    bx                        ;
  199.             push    es                        ;
  200.             call    getvct                    ; 割込みベクタ取得
  201.             pop        es                        ;
  202.             pop        bx                        ;
  203. vctchk_21:                                    ;
  204.             mov        ax,es                    ;
  205.             cmp        WORD PTR v_21+2,ax        ; 常駐セグメント比較
  206.             je        short vctchk_99            ;
  207.             mov        BYTE PTR hookflg,1        ; ベクタフックされている
  208. vctchk_99:                                    ;
  209.             ret                                ;
  210. mcb_err:                                    ;
  211.             mov        si,OFFSET msg6            ; MCBエラー
  212.             call    puts                    ;
  213.             ret                                ;
  214. ;----------------------------------------------------------------------------
  215. ;    プログラム名の設定(es=ds=csでcall)
  216. ;    常駐時の識別用として, コマンドライン領域にプログラム名を複写しておく.
  217. ;----------------------------------------------------------------------------
  218. setpname:                                    ;
  219.             mov        si,OFFSET prgname        ;
  220.             mov        di,OFFSET ARGUMENT        ;
  221.             mov        cx,prgnamelen            ;
  222.     rep        movsb                            ; ds:si->es:di
  223.             ret                                ;
  224. ;----------------------------------------------------------------------------
  225. ;    初期処理(es=ds=csでcall)
  226. ;----------------------------------------------------------------------------
  227. init:                                        ;
  228.             mov        ah,30h                    ; get dos version
  229.             cmp        BYTE PTR tsrflg,0        ; 常駐していない ?
  230.             jnz        short init_fcall        ; NO->far call
  231.             int        21h                        ;
  232.             jmp        short init_set            ;
  233. init_fcall:                                    ;
  234.             INT21H                            ;
  235. init_set:                                    ;
  236.             mov        defver,al                ;
  237.             mov        deflev,ah                ;
  238.             ret                                ;
  239. ;----------------------------------------------------------------------------
  240. ;    起動処理( メイン )
  241. ;----------------------------------------------------------------------------
  242. main        PROC    NEAR                    ;
  243.             mov        WORD PTR pspseg,es        ; PSPセグメント保存
  244.             cli                                ; 割り込み禁止
  245.             cld                                ;
  246. ;
  247.             mov        si,OFFSET msg0            ; オープニングメッセージ(文字列)
  248.             call    puts                    ;
  249.             call    tsr_chk                    ; 常駐チェック
  250.             cmp        BYTE PTR tsrflg,0        ; 常駐していない ?
  251.             jz        short arg_chk            ; YES->arg_chk
  252. ;
  253.             push    ds                        ; 常駐領域内パラメタを複写
  254.             push    es                        ;
  255.             mov        ax,es                    ;
  256.             push    ds                        ;
  257.             pop        es                        ;
  258.             mov        ds,ax                    ; ds<->es
  259.             mov        si,OFFSET paraoff        ;
  260.             mov        di,OFFSET paraoff        ;
  261.             mov        cx,parasize                ; パラメタ領域サイズ
  262.     rep        movsb                            ; ds:si->es:di
  263.             pop        es                        ;
  264.             pop        ds                        ;
  265. arg_chk:                                    ;
  266.             call    init                    ; 初期処理
  267.             sti                                ;
  268.             call    argchk                    ; 引数のチェック
  269.             mov        al,argflg                ;
  270.             or        al,al                    ; al=0 ?
  271.             jz        short tsr_init            ; YES->通常処理開始へ
  272.             mov        si,OFFSET usage            ; ヘルプメッセージ
  273.             call    puts                    ;
  274.             PRGEND                            ;
  275. tsr_init:                                    ;
  276.             mov        al,tsrflg                ; 常駐フラグ
  277.             or        al,al                    ; 常駐しているか ?
  278.             jz        short mem_noclr            ; NO->非常駐処理へ
  279. ;-------------------------------------------;
  280. ;    常駐解除処理
  281. ;-------------------------------------------;
  282. mem_clear:                                    ;
  283.             mov        al,relflg                ; 常駐解除フラグ
  284.             or        al,al                    ; 常駐解除しない ?
  285.             jz        short mem_update        ; YES->終了
  286. mem_clrchk:                                    ;
  287.             cmp        BYTE PTR hookflg,0        ; ベクタフックされていないか ?
  288.             je        short mem_clear_ok        ; YES->常駐解除
  289.             mov        si,OFFSET msg7            ; 常駐解除不可メッセージ
  290.             call    puts                    ;
  291.             PRGEND                            ;
  292. mem_clear_ok:                                ;
  293.             push    ds                        ;
  294.             lds        dx,DWORD PTR es:v_21    ;
  295.             mov        ax,2521h                ; 割り込みベクタを元に戻す!
  296.             int        21h                        ;
  297.             mov        ah,49h                    ; プログラムを開放
  298.             int        21h                        ;
  299.             pop        ds                        ;
  300.             jc        short mem_clrerr        ; メモリ開放失敗
  301.             mov        si,OFFSET msg2            ; 開放メッセージ
  302.             jmp        short mem_clrend        ;
  303. mem_clrerr:                                    ;
  304.             mov        si,OFFSET msg8            ; メモリ開放失敗メッセージ
  305. mem_clrend:                                    ;
  306.             call    puts                    ;
  307.             PRGEND                            ;
  308. ;
  309. mem_update:                                    ; 常駐領域内のパラメタ値変更
  310.             mov        si,OFFSET msg3            ; 常駐済メッセージ
  311.             call    puts                    ;
  312.             mov        al,optflg                ;
  313.             or        al,al                    ; オプション指定なし ?
  314.             jz        short mem_upend            ; YES->終了
  315.             cli                                ;
  316.             mov        si,OFFSET paraoff        ;
  317.             mov        di,OFFSET paraoff        ;
  318.             mov        cx,parasize                ; パラメタ領域サイズ
  319.     rep        movsb                            ; ds:si->es:di
  320.             sti                                ;
  321.             mov        si,OFFSET msg5            ; アップデートメッセージ(文字数)
  322.             call    puts                    ;
  323. mem_upend:                                    ;
  324.             PRGEND                            ;
  325. ;
  326. mem_noclr:                                    ;
  327.             mov        al,relflg                ; 常駐解除フラグ
  328.             or        al,al                    ; 常駐解除 ?
  329.             jz        short mem_setup            ; NO->常駐処理へ
  330.             mov        si,OFFSET msg4            ; 非常駐メッセージ
  331.             call    puts                    ;
  332.             PRGEND                            ;
  333. ;-------------------------------------------;
  334. ;    常駐処理
  335. ;-------------------------------------------;
  336. mem_setup:                                    ;
  337.             push    cs                        ;
  338.             pop        es                        ; es=cs
  339.             call    setpname                ;
  340.             mov        si,OFFSET msg1            ; 常駐メッセージ
  341.             call    puts                    ;
  342. ;
  343.             mov        dx,OFFSET i21h            ; 常駐処理プロシジャを
  344.             mov        ax,2521h                ; ベクタセット
  345.             int        21h                        ;
  346. ;
  347.             TSREND                            ; 常駐終了
  348. ;----------------------------------------------------------------------------
  349. ;    引数のチェック
  350. ;----------------------------------------------------------------------------
  351. argchk:                                        ; 引数のチェック
  352.             mov        bx,OFFSET ARGUMENT        ;
  353.             mov        BYTE PTR optflg,0        ;
  354. arglp:                                        ;
  355.             inc        bx                        ;
  356.             mov        al,[bx]                    ;
  357.             cmp        al,CR                    ;
  358.             jne        short optchk            ;
  359.             ret                                ; 引数チェック終了
  360. optchk:                                        ; 引数チェック開始
  361.             cmp        al,'-'                    ; オプションスイッチは'-','/'で始まる.
  362.             je        short optsw1            ;
  363.             cmp        al,'/'                    ;
  364.             je        short optsw1            ;
  365.             cmp        al,' '                    ; SPACE
  366.             je        short arglp                ;
  367.             cmp        al,TAB                    ; TAB
  368.             je        short arglp                ;
  369.             jmp        opterr                    ;
  370. optsw1:                                        ;
  371.             inc        bx                        ;
  372.             mov        al,[bx]                    ;
  373.             or        al,20H                    ; 大文字->小文字
  374.             cmp        al,'r'                    ; 'r','R'か ?
  375.             jne        short optsw2            ; NO->次のチェックへ
  376.             mov        BYTE PTR relflg,1        ; 常駐解除フラグ ON
  377.             jmp        short arglp                ;
  378. optsw2:                                        ; R/W以外のファンクション表示
  379.             cmp        al,'v'                    ; 'v'か ?
  380.             jne        short opterr            ; NO->次のチェックへ
  381.             call    atoi                    ;
  382.             cmp        BYTE PTR valflg,0        ; 数値指定あり ?
  383.             jne        short optsw2chk            ; YES->数値チェックへ
  384.             mov        al,[bx+1]                ;
  385.             cmp        al,'.'                    ; 小数点 ?
  386.             jz        short optsw2th            ; YES->小数点チェックへ
  387.             mov        al,defver                ;
  388.             mov        ver,al                    ; 標準値設定
  389.             jmp        short optsw2def            ;
  390. optsw2chk:                                    ;
  391.             mov        ver,al                    ; 値格納
  392.             mov        al,[bx+1]                ;
  393.             cmp        al,'.'                    ; 小数点 ?
  394.             jnz        short optswon            ; NO->次のチェックへ
  395. optsw2th:                                    ;
  396.             inc        bx                        ;
  397.             call    atoi                    ;
  398.             cmp        BYTE PTR valflg,0        ; 数値指定あり ?
  399.             jne        short optsw2lev            ; YES->数値チェックへ
  400. optsw2def:                                    ;
  401.             mov        al,deflev                ;
  402.             mov        lev,al                    ; 標準値設定
  403.             jmp        short optswon            ;
  404. optsw2lev:                                    ;
  405.             mov        lev,al                    ; 値格納
  406.             jmp        short optswon            ;
  407. optpause:                                    ;
  408.             mov        al,[bx+1]                ;
  409.             cmp        al,' '                    ; SPACE
  410.             je        short arglp                ;
  411.             cmp        al,TAB                    ; TAB
  412.             je        short arglp                ;
  413.             cmp        al,CR                    ; 終了
  414.             je        short arglp                ;
  415.             jmp        optsw1                    ;
  416. optswon:                                    ;
  417.             mov        BYTE PTR optflg,1        ; オプションスイッチ ON
  418.             jmp        short optpause            ;
  419. opterr:                                        ; オプションスイッチエラー
  420.             mov        BYTE PTR argflg,1        ;
  421.             ret                                ;
  422. ;----------------------------------------------------------------------------
  423. ;    文字列を整数に変換
  424. ;    < IN  >    : ds:bx    文字列の先頭位置-1
  425. ;    < RET >    : ax    整数値
  426. ;
  427. ;    < USE >    : bx, cx, dx
  428. ;----------------------------------------------------------------------------
  429. atoi:                                        ;
  430.             inc        bx                        ;
  431.             xor        ax,ax                    ; ax=0
  432.             xor        dx,dx                    ; dx=0
  433.             xor        ch,ch                    ; ch=0
  434.             mov        BYTE PTR valflg,0        ;
  435. atoi_next:                                    ;
  436.             mov        cl,[bx]                    ; 文字コード取得
  437.             sub        cl,'0'                    ; 文字->数字
  438.             jb        short atoi_end            ; '0'よりも小さければ終わり
  439.             cmp        cl,9                    ; '9'よりも大きいか ?
  440.             ja        short atoi_end            ; YESならば終わり
  441.             push    cx                        ;
  442.             mov        cx,0AH                    ;
  443.             imul    cx                        ; AXを10倍する
  444.             pop        cx                        ;
  445.             add        ax,cx                    ; AXに新値を格納
  446.             inc        bx                        ; 次の文字位置
  447.             mov        BYTE PTR valflg,1        ;
  448.             jmp        short atoi_next            ;
  449. atoi_end:                                    ;
  450.             dec        bx                        ; 先読み分を戻す
  451.             ret                                ;
  452. ;
  453. main        ENDP                            ;
  454. ;
  455. tsrflg        DB        0                        ; 常駐フラグ
  456. argflg        DB        0                        ; 引数チェックフラグ
  457. optflg        DB        0                        ; オプションフラグ
  458. valflg        DB        0                        ; オプション数値フラグ
  459. relflg        DB        0                        ; 常駐解除フラグ
  460. hookflg        DB        0                        ; ベクタフックフラグ
  461. ;
  462. defver        DB        ?                        ;
  463. deflev        DB        ?                        ;
  464. ;
  465. pspseg        DW        ?                        ; PSPセグメント
  466. prgname        DB        14,'TRAP-VER v1.00',CR    ;
  467. prgnamelen    EQU        $-prgname                ;
  468. ;
  469. msg0        DB        CR,LF,'MS-DOS trap-ver  Version 1.00  (C)パオパオ 1993. '
  470.             DB        CR,LF,0
  471. msg1        DB        '★ 常駐します ★',CR,LF,0
  472. msg2        DB        '☆ 常駐解除しました ☆',CR,LF,0
  473. msg3        DB        '常駐しています.',CR,LF,0
  474. msg4        DB        '常駐していません.',CR,LF,BEL,0
  475. msg5        DB        'オプションパラメタ値を更新しました.',CR,LF,BEL,0
  476. msg6        DB        'メモリの状態が正しくありません.',CR,LF,BEL,0
  477. msg7        DB        'ベクタをフックされているため, 常駐解除できません.'
  478.             DB        CR,LF,BEL,0
  479. msg8        DB        'メモリの開放に失敗しました.',CR,LF,BEL,0
  480. ;
  481. usage        DB        "Usage: 'TRAPVER "
  482.             DB        "[-r] [-v[d.f]]'"
  483.             DB        CR,LF
  484.             DB        '        -r       常駐解除        ',CR,LF
  485.             DB        '        -v[d.f]  バージョン      '
  486.             DB        '                 標準例: 3.10',CR,LF
  487.             DB        0
  488. ;
  489. code        ENDS                            ;
  490.             END        entry                    ;
  491. ;
  492. ;    < HISTORY >
  493. ;============================================================================
  494. ;    1993.03.16 : CREATE
  495. ;============================================================================
  496.  
  497.